package com.zzyl.nursing.job;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zzyl.nursing.domain.CheckIn;
import com.zzyl.nursing.domain.Contract;
import com.zzyl.nursing.service.ICheckInService;
import com.zzyl.nursing.service.IContractService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Component("upTime")
public class UpTime {
        @Autowired
        private IContractService contractService;
        @Autowired
        private ICheckInService checkInService;
    public void time(){
        //未生效->已生效
        LambdaUpdateWrapper<Contract> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(Contract::getStatus,1);
        updateWrapper.eq(Contract::getStatus,0);
        updateWrapper.lt(Contract::getStartDate,LocalDateTime.now());
        updateWrapper.gt(Contract::getEndDate,LocalDateTime.now());
        contractService.update(updateWrapper);
        //已生效->已过期
        LambdaUpdateWrapper<Contract> updateWrapper1 = new LambdaUpdateWrapper<>();
        updateWrapper1.set(Contract::getStatus,2);
        updateWrapper1.eq(Contract::getStatus,1);
        updateWrapper1.lt(Contract::getEndDate,LocalDateTime.now());
        contractService.update(updateWrapper1);
//        log.info("开始执行合同状态更新任务");
//
//        // 查询所有合同
//        List<Contract> contracts = contractService.list();
//
//        LocalDateTime now = LocalDateTime.now();
//        int contractUpdateCount = 0;
//        int checkInUpdateCount = 0;
//
//        for (Contract contract : contracts) {
//            Integer originalStatus = contract.getStatus();
//            Integer newStatus = calculateContractStatus(contract, now);
//
//            // 如果状态有变化，则更新
//            if (!newStatus.equals(originalStatus)) {
//                contract.setStatus(newStatus);
//                contractService.updateById(contract);
//                contractUpdateCount++;
//                log.info("合同ID:{} 状态从 {} 更新为 {}", contract.getId(), originalStatus, newStatus);
//
//                // 同时更新入住状态
//                LambdaQueryWrapper<CheckIn> queryWrapper = new LambdaQueryWrapper<>();
//                queryWrapper.eq(CheckIn::getElderId, contract.getElderId());
//                List<CheckIn> checkIns = checkInService.list(queryWrapper);
//
//                for (CheckIn checkIn : checkIns) {
//                    Integer originalCheckInStatus = checkIn.getStatus();
//                    Integer newCheckInStatus = calculateCheckInStatus(newStatus, checkIn);
//
//                    if (!newCheckInStatus.equals(originalCheckInStatus)) {
//                        checkIn.setStatus(newCheckInStatus);
//                        checkInService.updateById(checkIn);
//                        checkInUpdateCount++;
//                        log.info("入住记录ID:{} 状态从 {} 更新为 {}", checkIn.getId(), originalCheckInStatus, newCheckInStatus);
//                    }
//                }
//            }
//        }
//
//        log.info("合同状态更新任务执行完成，共更新合同 {} 条，入住记录 {} 条", contractUpdateCount, checkInUpdateCount);
//    }
//
//    /**
//     * 根据当前时间和合同时间计算合同状态
//     * @param contract 合同信息
//     * @param now 当前时间
//     * @return 合同状态 (0: 未生效, 1: 已生效/已入住, 2: 已过期/已到期)
//     */
//    private Integer calculateContractStatus(Contract contract, LocalDateTime now) {
//        LocalDateTime startDate = contract.getStartDate();
//        LocalDateTime endDate = contract.getEndDate();
//
//        // 如果开始时间为空，则返回未生效状态
//        if (startDate == null) {
//            return 0; // 未生效
//        }
//
//        // 如果当前时间小于开始时间，合同未生效
//        if (now.isBefore(startDate)) {
//            return 0; // 未生效
//        }
//
//        // 如果结束时间为空，或者当前时间小于等于结束时间，表示合同正在执行中（已入住）
//        if (endDate == null || !now.isAfter(endDate)) {
//            return 1; // 已生效/已入住
//        }
//
//        // 如果当前时间大于结束时间，合同已过期（已到期）
//        if (now.isAfter(endDate)) {
//            return 2; // 已过期/已到期
//        }
//
//        return 0; // 默认返回未生效
//    }
//
//    /**
//     * 根据合同状态计算入住状态
//     * @param contractStatus 合同状态
//     * @param checkIn 入住信息
//     * @return 入住状态 (0: 已入住, 1: 已退住)
//     */
//    private Integer calculateCheckInStatus(Integer contractStatus, CheckIn checkIn) {
//        // 如果合同状态为已生效，则入住状态为已入住
//        if (contractStatus == 1) {
//            return 0; // 已入住
//        }
//        // 如果合同状态为已过期，则入住状态为已退住
//        else if (contractStatus == 2) {
//            return 1; // 已退住
//        }
//        // 其他情况保持原状态不变
//        else {
//            return checkIn.getStatus();
//        }
    }
}
